using System;
using System.Collections.Generic;
using Utils;

namespace DotNetClassLib
{
  public enum TestEnum
  {
    first
  }

  public class TestClass
  {
    private string text;

    public string Text
    {
      get { return text; }
      set { text = value; }
    }

    public void Print()
    {
      Console.WriteLine(Text);
    }

    public TestClass(string text)
    {
      Text = text;
    }

    public TestClass()
    {
    }

    public int? NullableInt
    {
      get { return null; }
    }

    public DateTime CurrentDateTime
    {
      get { return DateTime.Now; }
    }

    public string[] ArrayTestString
    {
      get { return new string[] {"test1", "test3"}; }
      set {  }
    }

    public int[] ArrayTestInt
    {
      get { return new int[] { 1,4,56,21 }; }
      set {  }
    }

    public TestClass[] ArrayTestClass
    {
      get { return new TestClass[] { new TestClass("blah")  }; }
      set {  }
    }

    public ByValueStruct[] ArrayTestByValue
    {
      get { return new ByValueStruct[] { new ByValueStruct(), new ByValueStruct(), new ByValueStruct(), new ByValueStruct() }; }
      set { }
    }

    public void SetRefValue(ref object test)
    {
      test=new object();
    }

    public void SetOutValue(out object test)
    {
      test = new object();
    }

    public static void ThrowException()
    {
      throw new Exception("Test");
    }

    public IList<TestEnum> TestEnumList
    {
      get { return new List<TestEnum>(new TestEnum[] {TestEnum.first}); }
    }

    [DoNotWrap]
    public int IgnoreProperty
    {
      get { return 1; }
    }
  }

  public class TestClass2:TestClass
  {
    private readonly IList<TestClass2> listClass;

    public TestClass2(IList<TestClass2> listClass)
    {
      this.listClass = listClass;
    }

    public IList<TestClass2> ListClass
    {
      get { return listClass; }
    }
  }

  [DoNotWrap]
  public class TestClass3:TestClass2
  {
    public TestClass3(IList<TestClass2> listClass) : base(listClass)
    {
    }
  }

  [DoNotWrap]
  public interface NotWrappedInterface{}
}
